package main

import (
	"fmt"
	"reflect"
)

func main() {

	d:=dog{"小白",10}
	c:=cat{"好猫"}

	d.Run()
	c.Run()

	log("hello")
	log(123)
	log(c)

	str:="hello"
	var  a t
	a = str
	v,ok:=a.(string)//判断数据类型
	if ok {
		log(v)
	}

	//反射
	//dt:=reflect.TypeOf(d)
	dt:=reflect.TypeOf(&d)//传入类型是指针，是为了方便使用Elem函数
	sn:=dt.Name()
	fmt.Printf("反射对象的名称是=%s\n",sn)

	//使用Elem函数,如果不使用指针的话，会报panic: reflect: Elem of invalid type异常
	tag:=dt.Elem().Field(0).Name
	fmt.Println(tag)
	//遍历dog的所有字段
	num:=dt.Elem().NumField()
	for i:=0;i<num;i++ {
		name:=dt.Elem().Field(i).Name
		fmt.Println(name)
	}

	dv:=reflect.ValueOf(d)
	fieldByName:=dv.FieldByName("Name").String()//通过名称找到该字段的值
	fmt.Printf("字段名为Name的值是=%s",fieldByName)
	fmt.Println()

	isValid:=dv.FieldByName("hahahs").IsValid()
	if isValid {
		hahhahs:=dv.FieldByName("hahahs").String()
		fmt.Printf("字段名为hahahs的值是=%s",hahhahs)
		fmt.Println()
	}else {
		fmt.Println("没有hahahs字段")
		fmt.Println()
	}
}

type dog struct {
	Name string
	Age int
}

type cat struct {
	Name string
}

//dog 实现了接口amin
func (d *dog)Run()  {
	fmt.Println("the dog is runing")
}

// cat 实现了接口amin
func (c *cat)Run()  {
	fmt.Println("the cat is runing")
}

//接口
type amin interface {
	Run()
}

//interface为空表示任意类型的数值
func log(a interface{})  {
	fmt.Println(a)
}

//任意类型数值,那么t类似java的泛型
type t interface {

}